package com.fy.restfulapi.config;

import com.fy.restfulapi.advice.GlobalResponseDataAdvice;
import com.fy.restfulapi.annotation.ConditionalOnEnableRESTfulAnnotation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;


/**
 * @author sunlei
 *
 * @EnableConfigurationProperties 注解两个作用：
 * 1、让使用了 @ConfigurationProperties 注解的类RestApiGlobalDefaultProperties生效
 * 2、将该类RestApiGlobalDefaultProperties注入到 IOC 容器中,交由 IOC 容器进行管理
 *
 * @PropertySource 加载指定的属性文件（*.properties）到 Spring 的 Environment 中。可以配合 @Value 和 @ConfigurationProperties 使用。
 * 1、@PropertySource 和 @Value 组合使用，可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。
 * 2、@PropertySource 和 @ConfigurationProperties 组合使用，可以将属性文件与一个Java类绑定，将属性文件中的变量值注入到该Java类的成员变量中。
 *
 */

@Slf4j
@Configuration
//@EnableAutoConfiguration // 采用此种方式，然后配合在META-INF中配置spring.factories也可以实现自动装配，但是我们不打算用此种方式，我们采用EnableUnifiedRESTful注解的方式来进行自动装配
@EnableConfigurationProperties(RestApiGlobalDefaultProperties.class)
@PropertySource(value = "classpath:restful-api.properties", encoding = "UTF-8")
public class RestApiAutoConfiguration {
    private RestApiGlobalDefaultProperties properties;

    /**
     * EnableConfigurationProperties注解会自动将RestApiGlobalDefaultProperties注入到构造函数的参数中
     * @param properties 配置文件对应的Java类
     */
    public RestApiAutoConfiguration(RestApiGlobalDefaultProperties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnEnableRESTfulAnnotation
    public GlobalResponseDataAdvice globalResponseDataAdvice() {
        log.info("~~~~~~~~======== commonResponseDataAdvice init!!!");
        return new GlobalResponseDataAdvice(properties);
    }
}
